package no04;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/4/23 10:31
 * 二维数组中的查找
 * 在一个 n * m 的二维数组中，每一行都按照从左到右非递减的顺序排序，每一列都按照从上到下非递减的顺序排序。
 * 请完成一个高效的函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。
 * https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
 */
public class Solution {

    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        // 边界
        if (matrix == null || matrix.length == 0) {
            return false;
        }
        int row = matrix.length; // 行数
        // 从右上角的位置开始检索
        int i = 0;
        int j = matrix[0].length - 1;
        while (i < row && j >= 0) {
            if (target < matrix[i][j]) {
                // 如果比右上角的数字小, 则排除这一整列, 因为该位置为这一列最小的数字
                j--;
            } else if (target > matrix[i][j]) {
                // 如果 target 比该数字还要大, 则排除这一行, 因为该位置为这一行最大的数字(能检索的)
                i++;
            } else {
                // 找到了
                return true;
            }
        }
        return false;
    }
}
